from cnpy import *
from 图片资源 import *
from time import time, sleep
from pynput import keyboard
from src.skill import skill_select, skill_sort

植物大作战 = 软件类("植物大作战软件", 模拟器=True)
植物大作战.设置前台()
键鼠.窗口位置 = 植物大作战.窗口位置
运行脚本 = True
param = {
    "停止战斗": False,
    "战斗场次": 0,
    "胜利场次": 0,
    "失败场次": 0,
}

# 战技图标位置 = (1120, 1350)
右下空白位置 = (1120, 1880)
选择关卡位置 = (580, 785)
第一个技能位置 = (300, 900)
# (0, 0, 3840, 2160)
# 键鼠.移动鼠标(300,900)
# print(图像处理.找图(植物大作战.截图(), 玉米图标201, (0,0), 0.99))
# print(图像处理.找图(植物大作战.截图(), 豌豆连发, (0,0), 0.99))
print(图像处理.找图(植物大作战.截图(), 战斗失败图片))
# print(图像处理.找图(植物大作战.截图(), 战技可用, (0,0), 0.9999))
# print(图像处理.找图(植物大作战.截图(), 进入游戏异常图片))
# print(图像处理.找图(植物大作战.截图(), 精英模式图片))
# print(图像处理.找图(植物大作战.截图(), 战斗胜利确认按钮))
# 键鼠.精准点击((1120, 1880))
# print(strftime("%Y-%m-%d %H:%M:%S"))

def 监控F8(key):
    if key == keyboard.Key.f8:
        global 运行脚本
        运行脚本 = False

def 拒绝邀请():
    软件截图 = 植物大作战.截图()
    有邀请 = 图像处理.找图(软件截图, 邀请拒绝按钮)
    有总是拒绝 = 图像处理.找图(软件截图, 邀请总是拒绝按钮)
    if 有邀请:
        if 有总是拒绝:
            键鼠.精准点击(有总是拒绝["中心点"])
        键鼠.精准点击(有邀请["中心点"])
        print("✖️拒绝邀请")
        sleep(1)

def 关闭弹窗():
    global 右下空白位置
    软件截图 = 植物大作战.截图()
    弹窗列表 = [订单关闭弹窗, 订单超时弹窗, 首充礼包弹窗, 技能礼包弹窗, 技能礼包弹窗1, 宝石礼包弹窗, 城墙礼包弹窗, 金币礼包弹窗]
    for 弹窗 in 弹窗列表:
        有弹窗 = 图像处理.找图(软件截图, 弹窗)
        if 有弹窗:
            键鼠.精准点击(右下空白位置)
            print("✖️关闭礼包弹窗")
            sleep(1)

def 自动跳关(关卡):
    global 选择关卡位置
    global 右下空白位置
    # 拒绝邀请
    拒绝邀请()
    软件截图 = 植物大作战.截图()
    # 精英模式下切换到普通模式
    普通模式按钮 = 图像处理.找图(软件截图, 普通模式图片)
    if 普通模式按钮:
        键鼠.精准点击(普通模式按钮["中心点"])
        sleep(1)
        自动跳关(关卡)
        return
    print(f"↪️开始自动跳关，目标：第{关卡}关")
    有选择关卡弹窗 = 图像处理.找图(软件截图, 选择关卡弹窗)
    if 有选择关卡弹窗:
        键鼠.精准点击(右下空白位置)
        print(f"❌跳关异常，关闭跳关界面，重新开始跳关")
        sleep(1)
        自动跳关(关卡)
        return
    # 自动选择关卡
    按键位置 = {
        "1": (400, 1000),
        "2": (600, 1000),
        "3": (800, 1000),
        "4": (400, 1200),
        "5": (600, 1200),
        "6": (800, 1200),
        "7": (400, 1400),
        "8": (600, 1400),
        "9": (800, 1400),
        "0": (600, 1600),
    }
    # 按键重置位置 = (400, 1600)
    按键确认位置 = (800, 1600)
    关卡数组 = list(关卡)
    键鼠.精准点击(选择关卡位置)
    for 关卡数字 in 关卡数组:
        键鼠.精准点击(按键位置[关卡数字])
    键鼠.精准点击(按键确认位置)
    print("× 自动跳关结束")
    sleep(1)


def 循环内容(**config):
    global param
    global 右下空白位置
    软件截图 = 植物大作战.截图()
    有战斗标识 = 图像处理.找图(软件截图, 战斗标识)
    # 有战斗标识1 = 图像处理.找图(软件截图, 战斗标识1)

    # 战斗场景
    if 有战斗标识:
        if config["godClick"]:
            键鼠.精准点击(第一个技能位置)
        else:
            有技能刷新 = 图像处理.找图(软件截图, 技能刷新)
            有技能钻石刷新 = 图像处理.找图(软件截图, 技能刷新用钻石)
            # 选择技能
            if 有技能刷新 or 有技能钻石刷新:
                skill_select(软件截图, config["skills"])
                return

        战斗胜利 = 图像处理.找图(软件截图, 战斗胜利图片)
        战斗胜利1 = 图像处理.找图(软件截图, 战斗胜利1图片)
        战斗胜利mvp = 图像处理.找图(软件截图, 战斗胜利mvp图片)
        if 战斗胜利 or 战斗胜利1 or 战斗胜利mvp:
            param["战斗场次"] += 1
            param["胜利场次"] += 1
            时间 = strftime("%Y-%m-%d %H:%M:%S")
            print(f'[{时间}]🎉战斗胜利，共战斗：{param["战斗场次"]}，胜利：{param["胜利场次"]}，失败：{param["失败场次"]}')
            有双倍奖励 = 图像处理.找图(软件截图, 战斗胜利双倍按钮)
            有战斗确认按钮 = 图像处理.找图(软件截图, 战斗胜利确认按钮)
            # 有钻石奖励 = 图像处理.找图(软件截图, 战斗胜利钻石图片)
            # if 有双倍奖励 and 有钻石奖励:
            if 有双倍奖励:
                键鼠.精准点击(有双倍奖励["中心点"])
                print("💕领取双倍钻石奖励")
            键鼠.精准点击(有战斗确认按钮["中心点"])
            sleep(2)
            return

        战斗失败 = 图像处理.找图(软件截图, 战斗失败图片)
        战斗失败1 = 图像处理.找图(软件截图, 战斗失败1图片)
        if 战斗失败 or 战斗失败1:
            param["战斗场次"] += 1
            param["失败场次"] += 1
            时间 = strftime("%Y-%m-%d %H:%M:%S")
            print(f'[{时间}]❌战斗失败，共战斗：{param["战斗场次"]}，胜利：{param["胜利场次"]}，失败：{param["失败场次"]}')
            有战斗确认按钮 = 图像处理.找图(软件截图, 战斗胜利确认按钮)
            键鼠.精准点击(有战斗确认按钮["中心点"])
            sleep(2)
            return

        有BOSS圆盘 = 图像处理.找图(软件截图, Boss圆盘)
        if 有BOSS圆盘:
            有BOSS跳过按钮 = 图像处理.找图(软件截图, Boss跳过)
            if 有BOSS跳过按钮:
                键鼠.精准点击(有BOSS跳过按钮["中心点"])
                print("🍣快速领取boss奖励")
                sleep(0.5)
            键鼠.精准点击(右下空白位置)
            print("✖️关闭boss奖励弹窗")
            return

        有玉米战技 = 图像处理.找图(软件截图, 玉米战技)
        当前战技可用 = 图像处理.找图(软件截图, 战技可用, (0,0), 0.9999)
        # 使用战技
        if 有玉米战技 and 当前战技可用:
            键鼠.精准点击(有玉米战技["中心点"])

    # 非战斗场景
    else:
        # 无能量自动停止战斗
        跳出能量弹窗 = 图像处理.找图(软件截图, 能量礼包弹窗)
        if 跳出能量弹窗:
            param["停止战斗"] = True
            print("❌能量不足,游戏停止")
            return

        # 关闭所有弹窗
        关闭弹窗()
        # 拒绝邀请
        拒绝邀请()
        # 在最新关卡且指定了关卡
        当前在最新关卡 = 图像处理.找图(软件截图, 最新关卡)
        当前在600关 = 图像处理.找图(软件截图, 最新关卡六百)
        当前在600关1 = 图像处理.找图(软件截图, 最新关卡六百1)
        if (当前在最新关卡 or 当前在600关 or 当前在600关1) and config["level"]:
            自动跳关(config["level"])
            return

        有进入游戏 = 图像处理.找图(软件截图, 进入游戏图片)
        if 有进入游戏:
            当前是普通模式 = 图像处理.找图(软件截图, 精英模式图片)
            当前是精英模式 = 图像处理.找图(软件截图, 普通模式图片)
            有邀请按钮 = 图像处理.找图(软件截图, 邀请按钮)
            if (config["mode"] == "精英" or config["fight"] == False) and 当前是普通模式:
                键鼠.精准点击(当前是普通模式["中心点"])
                print("↪️切换到[精英模式]")
                sleep(1)
            elif config["mode"] == "普通" and 当前是精英模式:
                键鼠.精准点击(当前是普通模式["中心点"])
                print("↪️切换到[普通模式]")
                sleep(1)
            elif config["fight"] == False and 有邀请按钮:
                param["停止战斗"] = True
                print("❌队友掉线，战斗已停止")
                return
            else:
                键鼠.精准点击(有进入游戏["中心点"])
                时间 = strftime("%Y-%m-%d %H:%M:%S")
                print(f'[{时间}]▶️战斗开始，第{param["战斗场次"] + 1}场，当前关卡: {config["level"]}，模式: {config["mode"]}')
                sleep(1)
        else:
            进入游戏异常 = 图像处理.找图(软件截图, 进入游戏异常图片)
            if 进入游戏异常:
                时间 = strftime("%Y-%m-%d %H:%M:%S")
                print(f'[{时间}]❌游戏异常')
                return
            # 点击空白处关闭其他窗口
            键鼠.精准点击(右下空白位置)

# 主程序
def 自动战斗(**_config):
    工具.开启按键监控(监控F8)

    config = {
        "hour": 12, # 战斗时间（小时）
        "count": 0, # 战斗场次，优先于运行时间
        "mode": '精英', # 普通/精英
        "fight": True, # 组队模式下，队友退出是否继续战斗，当值为 False 时，mode默认为 ‘精英’
        "godClick": False, # 上帝模式，战斗内不判断技能，默认选第一个，战斗效率提速
        "skill": ["城墙", "冰锥", "冰爆", "莲舞"], # 技能组
        "level": None, # 选关
    }
    if _config:
        config.update(_config)
    # 存储所有技能
    config["skills"] = []

    # 变量重置
    global 运行脚本
    global param
    param["停止战斗"] = False
    param["战斗场次"] = 0
    param["胜利场次"] = 0
    param["失败场次"] = 0
    秒数 = config["hour"] * 60 * 60
    开始时间 = time()

    # 获取技能组
    config["skills"] = skill_sort(config["skill"])
    # 查看技能组是否正确
    desc = ''
    for skill in config["skills"]:
        if skill["log"]:
            desc += f"{skill['log']}，"
    print(f"技能选择优先级：\n{desc}\n")

    # 判断运行次数还是运行时间
    if config["count"] != 0:
        while param["战斗场次"] < config["count"] and 运行脚本:
            循环内容(**config)
        else:
            当前时间 = strftime("%Y-%m-%d %H:%M:%S")
            print(f'[{当前时间}]⭐战斗结束！总场次：{param["战斗场次"]}，胜利：{param["胜利场次"]}，失败：{param["失败场次"]}')
    else:
        while time() - 开始时间 < 秒数 and 运行脚本 and not param["停止战斗"]:
            循环内容(**config)
        else:
            当前时间 = strftime("%Y-%m-%d %H:%M:%S")
            print(f'[{当前时间}]⭐战斗结束！总场次：{param["战斗场次"]}，胜利：{param["胜利场次"]}，失败：{param["失败场次"]}')

